home *** CD-ROM | disk | FTP | other *** search
/ Gigarom 1 / Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso / FILES / HYP / T-Z / ZipCheck.cpt / zipCheck.c next >
Text File  |  1989-02-26  |  18KB  |  341 lines

  1. /* zipCheck.main.c */
  2. /* ==================================================================== */
  3. /*  HyperCard zipcode verfication function                              */
  4. /*  SYNTAX:  zipCheck(<"ZIPCODE">)                                      */
  5. /*           ZIPCODE must be either a 5-digit zipcode or                */
  6. /*           a 9-digit zip in the form "68938-0123" (10 characters)     */
  7. /*  RETURNS: Correct state abbreviation for valid zipcode; or           */
  8. /*           Null & beep for invalid zipcode                            */
  9. /*                                                                      */
  10. /*  © Copyright 1988 Sam Thornton, PO Box 123, Fairfield, NE 68938-0123 */
  11. /*  May be copied & distributed without charge only. Not for commercial */
  12. /*  sale or resale.                                                     */
  13. /*  Written in LSC 3.0 9/6/88 - some portions © by Symantec             */
  14. /*  MODIFIED 10/14/88                                                   */
  15. /* ==================================================================== */
  16.  
  17. #include "HyperXCmd.h"
  18. #include "SetUpA4.h"
  19. #include "MemoryMgr.h"
  20. #include "strings.h"
  21. #include "stdio.h"
  22. #include "ctype.h"
  23.  
  24. typedef struct zip {
  25.     char zipcode[4];
  26.     char state[3];
  27.     } zip;
  28.     
  29. /* Zipcode table lists valid 3-digit zipcodes for 50 states (ca. 1/88). */
  30. /* You can add or delete any number of other zipcodes (e.g. Puerto Rico)*/
  31. /* BUT zips MUST be in numeric order. Each table entry consists of a    */
  32. /* 3-digit zip followed by the corresponding state abbreviation.        */
  33.  
  34. zip zip_table[] = {
  35.     "010", "MA", "011", "MA", "012", "MA", "013", "MA", "014", "MA",
  36.     "015", "MA", "016", "MA", "017", "MA", "018", "MA", "019", "MA",
  37.     "020", "MA", "021", "MA", "022", "MA", "023", "MA", "024", "MA",
  38.     "025", "MA", "026", "MA", "027", "RI", "028", "RI", "029", "RI",
  39.     "030", "NH", "031", "NH", "032", "NH", "033", "NH", "034", "NH",
  40.     "035", "VT", "036", "VT", "037", "VT", "038", "NH", "039", "NH",
  41.     "040", "ME", "041", "ME", "042", "ME", "043", "ME", "044", "ME",
  42.     "045", "ME", "046", "ME", "047", "ME", "048", "ME", "049", "ME",
  43.     "050", "VT", "051", "VT", "052", "VT", "053", "VT", "054", "VT",
  44.     "056", "VT", "057", "VT", "058", "VT", "059", "NH", "060", "CT",
  45.     "061", "CT", "062", "CT", "063", "CT", "064", "CT", "065", "CT",
  46.     "066", "CT", "067", "CT", "068", "CT", "069", "CT", "070", "NJ",
  47.     "071", "NJ", "072", "NJ", "073", "NJ", "074", "NJ", "075", "NJ",
  48.     "076", "NJ", "077", "NJ", "078", "NJ", "079", "NJ", "080", "NJ",
  49.     "081", "NJ", "082", "NJ", "083", "NJ", "084", "NJ", "085", "NJ",
  50.     "086", "NJ", "087", "NJ", "088", "NJ", "089", "NJ", "100", "NY",
  51.     "101", "NY", "102", "NY", "103", "NY", "104", "NY", "105", "NY",
  52.     "106", "NY", "107", "NY", "108", "NY", "109", "NY", "110", "NY",
  53.     "111", "NY", "112", "NY", "113", "NY", "114", "NY", "115", "NY",
  54.     "116", "NY", "117", "NY", "118", "NY", "119", "NY", "120", "NY",
  55.     "121", "NY", "122", "NY", "123", "NY", "124", "NY", "125", "NY",
  56.     "126", "NY", "127", "NY", "128", "NY", "129", "NY", "130", "NY",
  57.     "131", "NY", "132", "NY", "133", "NY", "134", "NY", "135", "NY",
  58.     "136", "NY", "137", "NY", "138", "NY", "139", "NY", "140", "NY",
  59.     "141", "NY", "142", "NY", "143", "NY", "144", "NY", "145", "NY",
  60.     "146", "NY", "147", "NY", "148", "NY", "149", "NY", "150", "PA",
  61.     "151", "PA", "152", "PA", "153", "PA", "154", "PA", "155", "PA",
  62.     "156", "PA", "157", "PA", "158", "PA", "159", "PA", "160", "PA",
  63.     "161", "PA", "162", "PA", "163", "PA", "164", "PA", "165", "PA",
  64.     "166", "PA", "167", "PA", "168", "PA", "169", "PA", "170", "PA",
  65.     "171", "PA", "172", "PA", "173", "PA", "174", "PA", "175", "PA",
  66.     "176", "PA", "177", "PA", "178", "PA", "179", "PA", "180", "PA",
  67.     "181", "PA", "182", "PA", "183", "PA", "184", "PA", "185", "PA",
  68.     "186", "PA", "187", "PA", "188", "PA", "189", "PA", "190", "PA",
  69.     "191", "PA", "193", "PA", "194", "PA", "195", "PA", "196", "PA",
  70.     "197", "DE", "198", "DE", "199", "DE", "200", "DC", "202", "DC",
  71.     "203", "DC", "204", "DC", "205", "DC", "206", "MD", "207", "MD",
  72.     "208", "MD", "209", "MD", "210", "MD", "211", "MD", "212", "MD",
  73.     "213", "MD", "214", "MD", "215", "MD", "216", "MD", "217", "MD",
  74.     "218", "MD", "219", "MD", "220", "VA", "221", "VA", "222", "VA",
  75.     "223", "VA", "224", "VA", "225", "VA", "226", "VA", "227", "VA",
  76.     "228", "VA", "229", "VA", "230", "VA", "231", "VA", "232", "VA",
  77.     "233", "VA", "234", "VA", "235", "VA", "236", "VA", "237", "VA",
  78.     "238", "VA", "239", "VA", "240", "VA", "241", "VA", "242", "VA",
  79.     "243", "VA", "244", "VA", "245", "VA", "246", "WV", "247", "WV",
  80.     "248", "WV", "249", "WV", "250", "WV", "251", "WV", "252", "WV",
  81.     "253", "WV", "254", "WV", "255", "WV", "256", "WV", "257", "WV",
  82.     "258", "WV", "259", "WV", "260", "WV", "261", "WV", "262", "WV",
  83.     "263", "WV", "264", "WV", "265", "WV", "266", "WV", "267", "WV",
  84.     "268", "WV", "270", "NC", "271", "NC", "272", "NC", "273", "NC",
  85.     "274", "NC", "275", "NC", "276", "NC", "277", "NC", "278", "NC",
  86.     "279", "NC", "280", "NC", "281", "NC", "282", "NC", "283", "NC",
  87.     "284", "NC", "285", "NC", "286", "NC", "287", "NC", "288", "NC",
  88.     "289", "NC", "290", "SC", "291", "SC", "292", "SC", "293", "SC",
  89.     "294", "SC", "295", "SC", "296", "SC", "297", "SC", "298", "GA",
  90.     "299", "GA", "300", "GA", "301", "GA", "302", "GA", "303", "GA",
  91.     "304", "GA", "305", "GA", "306", "GA", "307", "GA", "308", "GA",
  92.     "309", "GA", "310", "GA", "311", "GA", "312", "GA", "313", "GA",
  93.     "314", "GA", "315", "GA", "316", "GA", "317", "GA", "318", "GA",
  94.     "319", "GA", "320", "FL", "321", "FL", "322", "FL", "323", "FL",
  95.     "324", "FL", "325", "FL", "326", "FL", "327", "FL", "328", "FL",
  96.     "329", "FL", "330", "FL", "331", "FL", "332", "FL", "333", "FL",
  97.     "334", "FL", "335", "FL", "336", "FL", "337", "FL", "338", "FL",
  98.     "339", "FL", "340", "FL", "342", "FL", "350", "AL", "351", "AL",
  99.     "352", "AL", "354", "AL", "355", "AL", "356", "AL", "357", "AL",
  100.     "358", "AL", "359", "AL", "360", "AL", "361", "AL", "362", "AL",
  101.     "363", "AL", "364", "AL", "365", "AL", "366", "AL", "367", "AL",
  102.     "368", "AL", "369", "AL", "370", "TN", "371", "TN", "372", "TN",
  103.     "373", "TN", "374", "TN", "376", "TN", "377", "TN", "378", "TN",
  104.     "379", "TN", "380", "TN", "381", "TN", "382", "TN", "383", "TN",
  105.     "384", "TN", "385", "TN", "386", "MS", "387", "MS", "388", "MS",
  106.     "389", "MS", "390", "MS", "391", "MS", "392", "MS", "393", "MS",
  107.     "394", "MS", "395", "MS", "396", "MS", "397", "MS", "400", "KY",
  108.     "401", "KY", "402", "KY", "403", "KY", "404", "KY", "405", "KY",
  109.     "406", "KY", "407", "KY", "408", "KY", "409", "KY", "410", "KY",
  110.     "411", "KY", "412", "KY", "413", "KY", "414", "KY", "415", "KY",
  111.     "416", "KY", "417", "KY", "418", "KY", "420", "KY", "421", "KY",
  112.     "422", "KY", "423", "KY", "424", "KY", "425", "KY", "426", "KY",
  113.     "427", "KY", "430", "OH", "431", "OH", "432", "OH", "433", "OH",
  114.     "434", "OH", "435", "OH", "436", "OH", "437", "OH", "438", "OH",
  115.     "439", "OH", "440", "OH", "441", "OH", "442", "OH", "443", "OH",
  116.     "444", "OH", "445", "OH", "446", "OH", "447", "OH", "448", "OH",
  117.     "449", "OH", "450", "OH", "451", "OH", "452", "OH", "453", "OH",
  118.     "454", "OH", "455", "OH", "456", "OH", "457", "OH", "458", "OH",
  119.     "460", "IN", "461", "IN", "462", "IN", "463", "IN", "464", "IN",
  120.     "465", "IN", "466", "IN", "467", "IN", "468", "IN", "469", "IN",
  121.     "470", "IN", "471", "IN", "472", "IN", "473", "IN", "474", "IN",
  122.     "475", "IN", "476", "IN", "477", "IN", "478", "IN", "479", "IN",
  123.     "480", "MI", "481", "MI", "482", "MI", "483", "MI", "484", "MI",
  124.     "485", "MI", "486", "MI", "487", "MI", "488", "MI", "489", "MI",
  125.     "490", "MI", "491", "MI", "492", "MI", "493", "MI", "494", "MI",
  126.     "495", "MI", "496", "MI", "497", "MI", "498", "MI", "499", "MI",
  127.     "500", "IA", "501", "IA", "502", "IA", "503", "IA", "504", "IA",
  128.     "505", "IA", "506", "IA", "507", "IA", "508", "IA", "509", "IA",
  129.     "510", "IA", "511", "IA", "512", "IA", "513", "IA", "514", "IA",
  130.     "515", "IA", "516", "IA", "520", "IA", "521", "IA", "522", "IA",
  131.     "523", "IA", "524", "IA", "525", "IA", "526", "IA", "527", "IA",
  132.     "528", "IA", "529", "IA", "530", "WI", "531", "WI", "532", "WI",
  133.     "534", "WI", "535", "WI", "537", "WI", "538", "WI", "539", "WI",
  134.     "540", "WI", "541", "WI", "542", "WI", "543", "WI", "544", "WI",
  135.     "545", "WI", "546", "WI", "547", "WI", "548", "WI", "549", "WI",
  136.     "550", "MN", "551", "MN", "553", "MN", "554", "MN", "556", "MN",
  137.     "557", "MN", "558", "MN", "559", "MN", "560", "MN", "561", "MN",
  138.     "562", "MN", "563", "MN", "564", "MN", "565", "MN", "566", "MN",
  139.     "567", "MN", "570", "SD", "571", "SD", "572", "SD", "573", "SD",
  140.     "574", "SD", "575", "SD", "576", "SD", "577", "SD", "580", "ND",
  141.     "581", "ND", "582", "ND", "583", "ND", "584", "ND", "585", "ND",
  142.     "586", "ND", "587", "ND", "588", "ND", "590", "MT", "591", "MT",
  143.     "592", "MT", "593", "MT", "594", "MT", "595", "MT", "596", "MT",
  144.     "597", "MT", "598", "MT", "599", "MT", "600", "IL", "601", "IL",
  145.     "602", "IL", "603", "IL", "604", "IL", "605", "IL", "606", "IL",
  146.     "609", "IL", "610", "IL", "611", "IL", "612", "IL", "613", "IL",
  147.     "614", "IL", "615", "IL", "616", "IL", "617", "IL", "618", "IL",
  148.     "619", "IL", "620", "IL", "621", "IL", "622", "IL", "623", "IL",
  149.     "624", "IL", "625", "IL", "626", "IL", "627", "IL", "628", "IL",
  150.     "629", "IL", "630", "MO", "631", "MO", "633", "MO", "634", "MO",
  151.     "635", "MO", "636", "MO", "637", "MO", "638", "MO", "639", "MO",
  152.     "640", "MO", "641", "MO", "644", "MO", "645", "MO", "646", "MO",
  153.     "647", "MO", "648", "MO", "650", "MO", "651", "MO", "652", "MO",
  154.     "653", "MO", "654", "MO", "655", "MO", "656", "MO", "657", "MO",
  155.     "658", "MO", "660", "KS", "661", "KS", "662", "KS", "664", "KS",
  156.     "665", "KS", "666", "KS", "667", "KS", "668", "KS", "669", "KS",
  157.     "670", "KS", "671", "KS", "672", "KS", "673", "KS", "674", "KS",
  158.     "675", "KS", "676", "KS", "677", "KS", "678", "KS", "679", "KS",
  159.     "680", "NE", "681", "NE", "683", "NE", "684", "NE", "685", "NE",
  160.     "686", "NE", "687", "NE", "688", "NE", "689", "NE", "690", "NE",
  161.     "691", "NE", "692", "NE", "693", "NE", "700", "LA", "701", "LA",
  162.     "703", "LA", "704", "LA", "705", "LA", "706", "LA", "707", "LA",
  163.     "708", "LA", "710", "LA", "711", "LA", "712", "LA", "713", "LA",
  164.     "714", "LA", "716", "AR", "717", "AR", "718", "AR", "719", "AR",
  165.     "720", "AR", "721", "AR", "722", "AR", "723", "AR", "724", "AR",
  166.     "725", "AR", "726", "AR", "727", "AR", "728", "AR", "729", "AR",
  167.     "730", "OK", "731", "OK", "734", "OK", "735", "OK", "736", "OK",
  168.     "737", "OK", "738", "OK", "739", "OK", "740", "OK", "741", "OK",
  169.     "743", "OK", "744", "OK", "745", "OK", "746", "OK", "747", "OK",
  170.     "748", "OK", "749", "OK", "750", "TX", "751", "TX", "752", "TX",
  171.     "753", "TX", "754", "TX", "755", "TX", "756", "TX", "757", "TX",
  172.     "758", "TX", "759", "TX", "760", "TX", "761", "TX", "762", "TX",
  173.     "763", "TX", "764", "TX", "765", "TX", "766", "TX", "767", "TX",
  174.     "768", "TX", "769", "TX", "770", "TX", "771", "TX", "772", "TX",
  175.     "773", "TX", "774", "TX", "775", "TX", "776", "TX", "777", "TX",
  176.     "778", "TX", "779", "TX", "780", "TX", "781", "TX", "782", "TX",
  177.     "783", "TX", "784", "TX", "785", "TX", "786", "TX", "787", "TX",
  178.     "788", "TX", "789", "TX", "790", "TX", "791", "TX", "792", "TX",
  179.     "793", "TX", "794", "TX", "795", "TX", "796", "TX", "797", "TX",
  180.     "798", "TX", "799", "TX", "800", "CO", "801", "CO", "802", "CO",
  181.     "803", "CO", "804", "CO", "805", "CO", "806", "CO", "807", "CO",
  182.     "808", "CO", "809", "CO", "810", "CO", "811", "CO", "812", "CO",
  183.     "813", "CO", "814", "CO", "815", "CO", "816", "CO", "820", "WY",
  184.     "821", "WY", "822", "WY", "823", "WY", "824", "WY", "825", "WY",
  185.     "826", "WY", "827", "WY", "828", "WY", "829", "WY", "830", "WY",
  186.     "831", "WY", "832", "ID", "833", "ID", "834", "ID", "835", "ID",
  187.     "836", "ID", "837", "ID", "838", "ID", "840", "UT", "841", "UT",
  188.     "842", "UT", "843", "UT", "844", "UT", "845", "UT", "846", "UT",
  189.     "847", "UT", "850", "AZ", "851", "AZ", "852", "AZ", "853", "AZ",
  190.     "855", "AZ", "856", "AZ", "857", "AZ", "859", "AZ", "860", "AZ",
  191.     "863", "AZ", "864", "AZ", "865", "AZ", "870", "NM", "871", "NM",
  192.     "872", "NM", "873", "NM", "874", "NM", "875", "NM", "877", "NM",
  193.     "878", "NM", "879", "NM", "880", "NM", "881", "NM", "882", "NM",
  194.     "883", "NM", "884", "NM", "889", "NV", "890", "NV", "891", "NV",
  195.     "893", "NV", "894", "NV", "895", "NV", "897", "NV", "898", "NV",
  196.     "900", "CA", "901", "CA", "902", "CA", "903", "CA", "904", "CA",
  197.     "905", "CA", "906", "CA", "907", "CA", "908", "CA", "910", "CA",
  198.     "911", "CA", "912", "CA", "913", "CA", "914", "CA", "915", "CA",
  199.     "916", "CA", "917", "CA", "918", "CA", "920", "CA", "921", "CA",
  200.     "922", "CA", "923", "CA", "924", "CA", "925", "CA", "926", "CA",
  201.     "927", "CA", "928", "CA", "930", "CA", "931", "CA", "932", "CA",
  202.     "933", "CA", "934", "CA", "935", "CA", "936", "CA", "937", "CA",
  203.     "939", "CA", "940", "CA", "941", "CA", "942", "CA", "943", "CA",
  204.     "944", "CA", "945", "CA", "946", "CA", "947", "CA", "948", "CA",
  205.     "949", "CA", "950", "CA", "951", "CA", "952", "CA", "953", "CA",
  206.     "954", "CA", "955", "CA", "956", "CA", "957", "CA", "958", "CA",
  207.     "959", "CA", "960", "CA", "961", "CA", "967", "HI", "968", "HI",
  208.     "970", "OR", "971", "OR", "972", "OR", "973", "OR", "974", "OR",
  209.     "975", "OR", "976", "OR", "977", "OR", "978", "OR", "979", "OR",
  210.     "980", "WA", "981", "WA", "982", "WA", "983", "WA", "984", "WA",
  211.     "985", "WA", "986", "WA", "987", "WA", "988", "WA", "989", "WA",
  212.     "990", "WA", "991", "WA", "992", "WA", "993", "WA", "994", "WA",
  213.     "995", "AK", "996", "AK", "997", "AK", "998", "AK", "999", "AK"
  214.     };
  215.  
  216. /* Get the number of entries in the zipcode table... */
  217. #define TABLE_LENGTH (sizeof(zip_table) / sizeof(struct zip)) - 1
  218.  
  219. /* =================================================================== */    
  220. /*                     MAIN PROCEDURE - EVALUATE ZIPCODE                 */
  221. /* =================================================================== */
  222.  
  223. pascal void main (paramPtr)
  224. XCmdBlockPtr paramPtr;
  225.  
  226. {
  227.     int zip_tab;
  228.     RememberA0();
  229.     SetUpA4();
  230.     
  231. /* First, check for appropriate length of zipcode */
  232.     zip_tab = strlen( *(paramPtr->params[0]) );
  233.     if (zip_tab != 5 && zip_tab != 10)
  234.         zip_tab = -1;
  235.     if (zip_tab == -1)
  236.         SysBeep(1); /* we been beeping twice on the screwy lengths */
  237.         
  238. /* If length is OK then see if it's a valid zipcode */
  239.     else
  240.         zip_tab = state_name(paramPtr);
  241.         
  242. /* If there is an error, beep and exit with empty result */
  243.     if (zip_tab < 0)
  244.         SysBeep(1);
  245.         
  246. /* Otherwise, return the correct state abbreviation */
  247.     else {
  248.     
  249.         paramPtr->returnValue = NewHandle(3);
  250.         **(paramPtr->returnValue) = zip_table[zip_tab].state[0];
  251.         *(*paramPtr->returnValue + 1) = zip_table[zip_tab].state[1];
  252.         *(*paramPtr->returnValue + 2) = '\0';
  253.         }
  254.         
  255.     RestoreA4(); 
  256.     return;
  257. }
  258.  
  259. /* =================================================================== */
  260. /* function to find and return array index number to correct state     */
  261. /* abbreviation, given a pointer to the entered zipcode                */
  262. /* =================================================================== */
  263.  
  264. int state_name (paramPtr)
  265. XCmdBlockPtr paramPtr;
  266. {
  267.     register top = 0;
  268.     register bottom = TABLE_LENGTH;
  269.     register midpoint = 1;
  270.     register flag = -1;
  271.     
  272.     while ( (flag < 0)  &&  (midpoint >= (top-1) ) ) {
  273.     
  274.     /* set the primary index check <midpoint> */
  275.         if ( ( (bottom - top)  % 2)  > 0)
  276.             (midpoint = (bottom - top) / 2) + 1;
  277.         else if (bottom != top)
  278.             midpoint = (bottom - top) / 2;
  279.         else
  280.             break; /* SOMETHING IS WROGHTEN IN DINMARK - BAIL OUT! */
  281.     
  282.     /* check outer boundaries of search <top><bottom> for hit */
  283.         if (compare(paramPtr, top) == 0)
  284.             flag = top;
  285.             
  286.         else if (compare(paramPtr, bottom) == 0)
  287.             flag = bottom;
  288.     
  289.     /* ...if flag was reset to >=0 guess what! there was a hit */
  290.         if (flag >= 0)
  291.             break;
  292.     
  293.     /* otherwise, check the new <midpoint> */
  294.         switch (compare(paramPtr, midpoint)) {
  295.         
  296.             /* 3-DIGIT ZIP = TABLE ENTRY */
  297.             case 0:  flag = midpoint;
  298.                      break;
  299.                     
  300.             /* 3-DIGIT ZIP > TABLE ENTRY */
  301.             case 1:  top = midpoint + 1;
  302.                      bottom--;
  303.                      break;
  304.             
  305.             /* 3-DIGIT ZIP < TABLE ENTRY */
  306.             case 2:  bottom = midpoint - 1;
  307.                      top++;
  308.                      break;
  309.                     
  310.         } /* END OF SWITCH STATEMENT */
  311.         
  312.     } /* END OF WHILE STATEMENT */
  313.  
  314.     return(flag);
  315.     
  316. } /* END OF FUNCTION */
  317.  
  318. /* =================================================================== */
  319. /* function to return FLAG signalling <, =, > comparison result,       */
  320. /* given pointer to entered zipcode, and the array index pointer       */
  321. /* =================================================================== */
  322.  
  323. int compare (paramPtr, zip_ptr)
  324. XCmdBlockPtr paramPtr; int zip_ptr;
  325. {
  326.     register comp, flag;
  327.     flag = 0;
  328.     
  329.     /* for first 3 characters of zipcode:
  330.        return <0 if zipcode < table entry
  331.        return =0 if zipcode == table entry
  332.        return >0 if zipcode > table entry */
  333.  
  334.     comp = strncmp( *(paramPtr->params[0]), &zip_table[zip_ptr].zipcode[0], 3 );
  335.         if (comp < 0)
  336.             flag = 2;
  337.         else if (comp > 0)
  338.             flag = 1;
  339.     return(flag);
  340. }
  341.